/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Servico;

import DAO.MovimentacaoDAO;
import Modelo.Usuario;
import Modelo.UsuarioVaga;
import Modelo.Vaga;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import util.FabricaDeObjetos;
import util.JPAUtil;

/**
 *
 * @author ntpadmin
 */
public class MovimentacaoService {

    private static MovimentacaoDAO movimentacaoDAO;

    static {
        try {
            movimentacaoDAO = (MovimentacaoDAO) FabricaDeObjetos.getObjetoUnico(MovimentacaoDAO.class);
        } catch (Exception ex) {
            Logger.getLogger(MovimentacaoService.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

//    public void validaInformacoesUsuario(Usuario usuarioCorrente) throws Exception {
//
//        if (isBlank(usuarioCorrente.getNome()) || isBlank(usuarioCorrente.getRg()) || isBlank(usuarioCorrente.getCpf())) {
//            throw new Exception("Usuario invalido!");
//        }
//    }

    private boolean isBlank(String str) {
        return (str == null) || (str.trim().equals(""));
    }


    public List<UsuarioVaga> consultar(Usuario usuarioConsulta, Vaga vagaConsulta, UsuarioVaga movimentacaoConsulta) throws Exception {

        List<UsuarioVaga> retorno = new ArrayList<UsuarioVaga>();

        if (!camposEmBranco(usuarioConsulta) || !camposEmBranco(vagaConsulta) || !camposEmBranco(movimentacaoConsulta)) {

            retorno = movimentacaoDAO.getByFilters(usuarioConsulta, vagaConsulta, movimentacaoConsulta);

        } else {
            retorno = movimentacaoDAO.getAll();
        }

        if (retorno != null && !retorno.isEmpty()) {
            return retorno;
        } else {
            throw new Exception("Nenhum resultado encontrado!");
        }
    }

    public void incluirMovimentacao(UsuarioVaga movimentacao) throws Exception {
        movimentacaoDAO.insert(movimentacao);
    }

    public boolean movimentacaoCadastrada(Usuario usuario, Vaga vaga) {
        
        UsuarioVaga retorno = null;
        
//        if (movimentacao != null && movimentacao.getId() != null) {
//
//            retorno = movimentacaoDAO.getByPrimaryKey(movimentacao);
//
//        } else {
//
//            List<UsuarioVaga> listaMovimentacoes = movimentacaoDAO.getByFilters(movimentacao);
//
//            for (UsuarioVaga mov : listaMovimentacoes) {
//
//                if (mov.equals(movimentacao)) {
//
//                    retorno = mov;
//
//                    break;
//                }
//            }
//        }

        return retorno != null;
    }

    private boolean camposEmBranco(Usuario usuario){
        return (isBlank(usuario.getNome()) && isBlank(usuario.getRg()) && isBlank(usuario.getCpf()) && isBlank(usuario.getMatricula()));
    }

    private boolean camposEmBranco(Vaga vaga){
        return (isBlank(vaga.getCodigo()) && isBlank(vaga.getCampus()));
    }

    private boolean camposEmBranco(UsuarioVaga movimentacao){
        return (isBlank(movimentacao.getPlacaVeiculo()) && isBlank(movimentacao.getTipoVeiculo()) && isBlank(movimentacao.getDtEntrada()) && isBlank(movimentacao.getDtEntrada()));
    }

    public void remover(UsuarioVaga movimentacao) {

        JPAUtil.beginTransaction();

        movimentacaoDAO.merge(movimentacao);
        
        movimentacaoDAO.remove(movimentacao);

        JPAUtil.commitTransaction();
    }

    public void editar(UsuarioVaga movimentacao) {
        
        JPAUtil.beginTransaction();

        movimentacaoDAO.merge(movimentacao);

        JPAUtil.commitTransaction();
    }
    
    public void incluir(UsuarioVaga movimentacaoCorrente, List<Usuario> usuarioResultadoConsulta, List<Vaga> vagaResultadoConsulta) throws Exception {
       
        if (!movimentacaoCadastrada(null, null)) {

            validaInformacoesMovimentacao(movimentacaoCorrente, usuarioResultadoConsulta, vagaResultadoConsulta);

            validaDataMovimentacao(movimentacaoCorrente);

            incluirMovimentacao(movimentacaoCorrente);

        } else {
            throw new Exception("Não foi possivel incluir a Movimentacao pois a mesma já foi cadastrada!");
        }
    }

    private void validaInformacoesMovimentacao(UsuarioVaga movimentacaoCorrente, List<Usuario> usuarioResultadoConsulta, List<Vaga> vagaResultadoConsulta) throws Exception {

        if (isBlank(movimentacaoCorrente.getTipoVeiculo()) || isBlank(movimentacaoCorrente.getPlacaVeiculo())) {
            throw new Exception("Os campos da secao Veiculo sao obrigatorios!");
        }

        boolean achou = false;

        Vaga vagaMarcada = null;
        Usuario usuarioMarcado = null;

        for (Usuario usuario : usuarioResultadoConsulta) {
            if (usuario.isChecked()) {
                if (!achou) {
                    usuarioMarcado = usuario;
                    achou = true;
                } else {
                    throw new Exception("Selecione somente UM Usuario!");
                }
            }
        }

        achou = false;

        for (Vaga vaga : vagaResultadoConsulta) {
            if (vaga.isChecked()) {
                if (!achou) {
                    vagaMarcada = vaga;
                    achou = true;
                } else {
                    throw new Exception("Selecione somente UMA Vaga!");
                }
            }
        }

        if (usuarioMarcado != null && vagaMarcada != null) {
            movimentacaoCorrente.setUsuario(usuarioMarcado);
            movimentacaoCorrente.setVaga(vagaMarcada);
        } else {
            throw new Exception("Selecione UM Usuario e UMA Vaga!");
        }
    }

    private void validaDataMovimentacao(UsuarioVaga movimentacaoCorrente) throws Exception {

        if (isBlank(movimentacaoCorrente.getDtEntrada())) {
            if (!isBlank(movimentacaoCorrente.getDtSaida())) {
                throw new Exception("Veiculo com Data de Saida mas sem Data de Entrada!");
            } else {
                movimentacaoCorrente.setDtEntrada(new Date().toString());
            }
        } else {
            if (!isBlank(movimentacaoCorrente.getDtSaida()) ) {
                throw new Exception("Veiculo com Data de Entrada e Data de Saida!");
            } else {
                GregorianCalendar calendar = new GregorianCalendar();
                calendar.setTime(new Date());
                System.out.println(calendar.getInstance(Locale.ENGLISH).getTime().toString());
                movimentacaoCorrente.setDtSaida(new Date().toString());
            }
        }
    }
}